/*
输入正整数 X，求 X 的大于 1 的因子组成的满足任意前一项都能整除后一项的严格递增序列的最大长度，以及满足最大长度的序列的个数。

输入格式
输入包含多组数据，每组数据占一行，包含一个正整数表示 X。

输出格式
对于每组数据，输出序列的最大长度以及满足最大长度的序列的个数。

每个结果占一行。

数据范围
1≤X≤2^20
输入样例：
2
3
4
10
100
输出样例：
1 1
1 1
2 1
2 2
4 6
*/
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = (1 << 20) + 10;
int primes[N], cnt;
int minp[N];
bool st[N];
int get_primes(int n)
{
    for (int i = 2; i <= n; i++)
    {
        if (!st[i])
        {
            minp[i] = i;
            primes[cnt++] = i;
        }

        for (int j = 0; i * primes[j] <= n; j++)
        {
            int t = primes[j] * i;
            st[t] = true;
            minp[t] = primes[j];
            if (i % primes[j] == 0)
                break;
        }
    }
}
int main(int argc, const char **argv)
{
    get_primes(N - 1);
    int x;
    while (cin >> x && x != -1)
    {
        int fact[30], sum[30], k = 0, tot = 0; // 存储每个质因子

        while (x > 1)
        {
            int p = minp[x];
            fact[k] = p, sum[k] = 0; // sum[k]=0 不写 会算出来奇怪的答案
            while (x % p == 0)
            {
                x /= p;
                sum[k]++;
                tot++;
            }
            k++;
        }
        LL res = 1;
        for (int i = 1; i <= tot; i++)
            res *= i;

        for (int i = 0; i < k; i++)
            for (int j = 1; j <= sum[i]; j++)
                res /= j;
        cout << tot << " " << res << endl;
    }
    return 0;
}
